# from django.utils.deprecation import MiddlewareMixin

# class MyMiddleware(MiddlewareMixin):  # 如果是高于1.8的版本中间件需要继承 MiddlewareMixin
from django.http import HttpResponse, HttpResponseForbidden


class MyMiddleware:

    def __init__(self):
        """
        只会执行一次，第一次请求的时候执行，后面就不再执行
        """
        print('_______init')

    def process_request(self, request):
        """
        执行位置：构造好请求之后，在匹配视图之前执行，返回None将继续执行，如果返回 HttpResponse对象将直接返回浏览器

        """
        print("_______process_request")

        # ip黑名单拦截器
        # blacklist = ["127.0.0.1", '120.163.125.1']
        # client_ip = request.META.get("REMOTE_ADDR")  # 获取到客户端请求的ip地址
        # if client_ip in blacklist:
        #     # return HttpResponse("fuck spider")
        #     return HttpResponseForbidden("403")

    def process_view(self, request, view_func, view_args, view_kwargs):
        """
        执行位置： 配置中视图之后，但是在执行视图之前执行

        :param request: 请求对象
        :param view_func: 视图函数
        :param view_args: 视图函数的位置参数
        :param view_kwargs: 视图函数的关键字参数
        :return:   返回一个None，将继续执行视图函数，如果返回一个HttpResponse直接返回给浏览器
        """
        print("______process_view")

    def process_template_response(self, request, response):
        """
        执行位置：执行完视图之后，在处理模板响应之前执行
        :param request: 请求对象
        :param response: 响应对象
        :return:  必须返回一个HttpResponse
        """
        print("——————————process_template_response")
        return response


    def process_response(self, request, response):
        """
        执行位置：返回数据给浏览器之前执行
        :param response:
        :return:  返回  HttpResponse
        """
        print("_____process_response")
        return response

    def process_exception(self, request, exception):
        """
        当视图函数抛出异常时执行，需要返回一个HttpResponse 对象
        :param request:
        :param exception:
        :return:
        """
        return HttpResponse("视图函数抛出异常")
